package com.qire.manhua.dal;

import com.qire.antsbinder.dal.DataWarehouse.*;
import com.qire.antsbinder.dal.annotation.DataAccess;
import com.qire.antsbinder.dal.annotation.ParamsAlias;
import com.qire.common.constant.Url;
import com.qire.manhua.dal.converter.EnablePreferencesConverter;
import com.qire.manhua.model.vo.BuyMembersPageVO;
import com.qire.manhua.model.vo.HomeRecommendModuleRefreshVO;
import com.qire.manhua.model.vo.HomeRecommendNewComicItemVO;
import com.qire.manhua.model.vo.HomeRecommendUpdateItemVO;
import com.qire.manhua.model.vo.HomeRecommendVO;
import com.qire.manhua.model.vo.HomeRecommendVipVO;
import com.qire.manhua.model.vo.MessageCenterPageVO;
import com.qire.manhua.model.vo.MessageCommentPageVO;
import com.qire.manhua.model.vo.MessageLikePageVO;
import com.qire.manhua.model.vo.RecommendModuleMoreItemVO;

import java.util.List;

/**
 * 页面数据
 */
public interface IPageDataDAL {

    /**
     * @return 首页推荐Vip专区页面数据
     */
    @DataAccess(url = Url.HomeRecommendVipZoneData, methodType = MethodType.GET, cacheMode = WarehouseCacheMode.FIRST_CACHE_THEN_REQUEST)
    HomeRecommendVipVO fetchRecommendVipZonePageData();

    /**
     * @param enablePreferences 启用偏好采集推送
     * @return 首页推荐热门（推荐）页面数据
     */
    @DataAccess(url = Url.HomeRecommendHotData, methodType = MethodType.GET, cacheMode = WarehouseCacheMode.REQUEST_FAILED_READ_CACHE)
    HomeRecommendVO fetchRecommendHotPageData(@ParamsAlias(name = "user_privacy", converter = EnablePreferencesConverter.class) boolean enablePreferences);

    /**
     * 分页页面数据，需要记录第一次操作时间戳，否则后端数据查询时，可能因为新增数据而导致数据重复异常。
     * @param pageNo    页面号
     * @param timeStamp 第一次操作时间戳
     * @return 首页推荐最近更新的一页数据。
     */
    @DataAccess(url = Url.HomeRecommendUpdateData, methodType = MethodType.GET)
    List<HomeRecommendUpdateItemVO> fetchRecommendUpdatePageData(@ParamsAlias(name = "page") int pageNo, @ParamsAlias(name = "ot") long timeStamp);

    /**
     * @return 首页推荐女生页面数据
     */
    @DataAccess(url = Url.HomeRecommendGirls, methodType = MethodType.GET, cacheMode = WarehouseCacheMode.FIRST_CACHE_THEN_REQUEST)
    HomeRecommendVO fetchRecommendGirlsPageData();

    /**
     * @return 首页推荐男生页面数据
     */
    @DataAccess(url = Url.HomeRecommendBoys, methodType = MethodType.GET, cacheMode = WarehouseCacheMode.FIRST_CACHE_THEN_REQUEST)
    HomeRecommendVO fetchRecommendBoysPageData();


    /**
     * 分页页面数据，需要记录第一次操作时间戳，否则后端数据查询时，可能因为新增数据而导致数据重复异常。
     * @param pageNo 页面号
     * @return 首页推荐新作的一页数据。
     */
    @DataAccess(url = Url.v5_newComic, methodType = MethodType.GET)
    List<HomeRecommendNewComicItemVO> fetchRecommendNewComicPageData(@ParamsAlias(name = "page") int pageNo);

    /**
     * @param moduleId  模块ID
     * @param pageNo    刷新批次页码
     * @return 首页推荐单个模块刷新换一批数据
     */
    @DataAccess(url = Url.HomeRecommendModuleRefresh, methodType = MethodType.GET)
    HomeRecommendModuleRefreshVO refreshRecommendModuleData(@ParamsAlias(name = "module_id") int moduleId, @ParamsAlias(name = "page") int pageNo);

    /**
     * 推荐模块更多的项目数据
     * @param moduleId 推荐模块ID
     * @param pageNo 页号
     * @return 推荐模块更多的项目数据列表
     */
    @DataAccess(url = Url.v5_moreRecommend, methodType = MethodType.GET)
    List<RecommendModuleMoreItemVO> fetchRecommendModuleMoreItemData(@ParamsAlias(name = "module_id") int moduleId, @ParamsAlias(name = "page") int pageNo);

    /**
     * 开通会元页面数据，VIP奖励信息，及VIP免费书籍推荐
     * @return
     */
    @DataAccess(url = Url.MembersPackagePageData, methodType = MethodType.GET, cacheMode = WarehouseCacheMode.FIRST_CACHE_THEN_REQUEST)
    BuyMembersPageVO fetchMembersPackageFreeBook();


    /**
     * 获取消息中心页面数据
     * @param pageNo 页面号
     * @return
     */
    @DataAccess(url = Url.MessageCenterPageData)
    MessageCenterPageVO fetchMessageCenterPageData(@ParamsAlias(name = "page") int pageNo);

    /**
     * 获取消息：评论列表页数据
     * @param pageNo 页号
     * @return
     */
    @DataAccess(url = Url.MessageCommentPageData)
    MessageCommentPageVO[] fetchMessageCommentPageData(@ParamsAlias(name = "page") int pageNo);

    /**
     * 获取消息：点赞列表页数据
     * @param pageNo 页号
     * @return
     */
    @DataAccess(url = Url.MessageLikePageData)
    MessageLikePageVO[] fetchMessageLikePageData(@ParamsAlias(name = "page") int pageNo);

}
